package com.ts.enterprise.exception;

import lombok.Getter;
import lombok.NoArgsConstructor;

/**
 * 全局异常错误码枚举类
 * 这里目前只定义基础错误码, 具体的二三级错误码定义在相应的异常子包下,
 * <p>
 * 错误码规则: 每一级支持扩展99个下级
 * 三级错误码: x,xx,01,00 - xx,xx,
 *
 * @author meng.yu
 * @date 2020/7/29
 */

@Getter
@NoArgsConstructor
public enum ExceptionEnum {

    UNAUTHENTICATED_EXCEPTION(401, "未认证"),
    UNKNOW_EXCEPTION(5000, "内部错误, 请联系管理员"),
    /**
     * 安全-权限相关异常枚举类 code_start = 10000
     */
    ROLE_USER_CHANGE_EXCEPTION(401, "角色已被修改,请重新登录"),
    LOGIN_REQUIRED_PARAM_EXCEPTION(401, "登录注解错误"),
    VERIFICATION_CODE_EXCEPTION(5103, "验证码错误"),
    TOKEN_ANALYSIS_LOGIN_USER_EXCEPTION(401, "token解析错误"),
    SECURITY_EXCEPTION(10000, "安全异常"),
    AUTHENTICATION_EXCEPTION(10001, "登录授权异常"),
    UNAUTHORIZED_EXCEPTION(10002, "无操作权限,请联系管理员"),
    TOKEN_EXPIRED_EXCEPTION(401, "登录信息已过期,请重新登录"),
    ACCOUNT_LOCKED_EXCEPTION(10004, "账号已被禁用"),
    ACCOUNT_NOT_EXIST_EXCEPTION(10005, "当前账号不存在,请先注册", true),
    ACCOUNT_PASSWORD_NOT_MATCH_EXCEPTION(10006, "账号密码不匹配"),
    INVALID_MOBILE_NUMBER(10007, "手机号码不正确"),
    SMS_SEND_FAIL(10008, "发送短信失败"),
    BUCKET_CREATE_FAIL(10009, "oss桶创建失败"),
    OSS_APP_TOKEN_FAIL(10010, "oss移动端token获取失败"),
    TRACK_100_QUERY_FAIL(10011, "快递查询错误"),
    TRACK_PRINT_PARTNER_FAIL(10012, "快递电子面签打印错误"),
    SMS_SEND_SPEED_FAIL(10013, "发送频率过高"),
    EXIST_SENSITIVE_WORD_ERROR(10014, "存在敏感词"),
    MERCHANT_INFO_NO_EXIST(10015, "商家电子面单/打印机/发货地址可能不存在"),
    TRACK_CANCEL_PARTNER_FAIL(10016, "快递配送取消异常"),
    TRACK_PRINT_PARTNER_OLD_FAIL(10017, "快递电子面签复打失败"),
    ORDER_OUT_TRADE_NO_PAYING(10018, "支付频繁,请稍后"),
    ISV_BUSINESS_LIMIT_CONTROL(10019, "该号码发送频率过高"),
    SAME_NAME_ERROR(10020, "存在同主属性名称"),
    SAME_ENTRY_ERROR(10021, "您已报过名啦"),
    COMPANY_NAME_EXIST_EXCEPTION(10022, "已存在重复手机号和企业名"),
    USER_MOBILE_TENANT_EXIST_EXCEPTION(10023, "用户手机号企业已存在"),
    COMPANY_DEP_PARENT_EXIST_EXCEPTION(10024, "部门名重复"),
    USER_SAVE_EXCEPTION(10025, "用户保存更新失败"),
    DEP_SAVE_EXIST_EXCEPTION(10026, "部门保存更新失败"),
    ROLE_NAME_SAME_EXCEPTION(10027, "角色名重复", true),
    ROLE_USER_EXIST_EXCEPTION(10028, "该角色下存在用户", true),
    ROLE_NOT_EXIST_EXCEPTION(10029, "查询角色不存在"),
    ROLE_TENANT_EXIST_EXCEPTION(10030, "租户已存在角色"),
    COMPANY_CREATE_EXCEPTION(10031, "企业创建失败"),
    LEAVE_STATUS_EXCEPTION(10032, "账户离职状态"),
    APPLYING_STATUS_EXCEPTION(10033, "账户申请中"),
    CREATE_SAME_DEPARTMENT_NAME_ERROR(10034, "部门名称禁止重复"),
    CHILD_DEP_DEPARTMENT_ERROR(10035, "此部门下存在子部门"),
    CHILD_USER_DEPARTMENT_ERROR(10036, "此部门下存在用户", true),
    LOG_OUT_STATUS_EXCEPTION(10037, "账户已注销"),
    NOT_ON_JOB_STATUS_EXCEPTION(10038, "账户状态异常"),
    INVITE_CODE_NOT_EXIST_EXCEPTION(10039, "企业邀请码不存在"),
    JOIN_COMPANY_EXIST_EXCEPTION(10040, "该员工已加入企业"),
    JOIN_OTHER_COMPANY_EXIST_EXCEPTION(10041, "该员工已加入其他企业"),
    COMPANY_PARTNER_CREATE_EXCEPTION(10042, "合作企业创建失败"),
    COMPANY_PARTNER_DELETE_EXCEPTION(10043, "合作企业删除失败"),
    COMPANY_NOT_OWN_CREATE_EXCEPTION(10044, "该合作企业非当前企业创建"),
    ORDER_SAME_APPLY_OUT_EXCEPTION(10045, "发单/接单企业相同"),
    ACCOUNT_BINDING_MOBILE_EXCEPTION(10046, "该微信已绑定手机号"),
    ACCOUNT_NOT_BINDING_MOBILE_EXCEPTION(10047, "该微信未绑定手机号"),
    ACCOUNT_BINDING_ERROR_EXCEPTION(10048, "微信绑定手机号失败"),
    IN_APPLYING_COMPANY_EXIST_EXCEPTION(10049, "该员工已申请加入该企业"),
    ACCOUNT_NO_PASSWORD_EXCEPTION(10050, "您暂未设置密码,请先重置"),
    PERMISSION_NO_PROCESS_NUMBER_EXCEPTION(10051, "该上数您无权操作修改"),
    ALREADY_BACK_PROCESS_NUMBER_EXCEPTION(10052, "该上数已经撤回"),
    TOO_MANY_PROCESS_NUMBER_EXCEPTION(10053, "该上数数量超限", true),
    OWN_COMPANY_INFO_EXCEPTION(10054, "当前账户不可操作,请切换重试", true),
    NOT_IS_PAY_EXCEPTION(10055, "此单还未结算"),
    IS_PAY_EXCEPTION(10056, "此单已结算"),
    ID_CARD_EXCEPTION(10057, "身份证输入错误", true),
    SAME_USER_PROCESS_NUMBER_EXCEPTION(10058, "保存上数用户重复"),
    NOT_ACCORDANCE_USER_COMPANY_EXCEPTION(10059, "用户和企业数据不一致"),
    ROLE_NOT_DELETABLE_EXCEPTION(10060, "该角色不可删除"),
    ROLE_SAVE_EXCEPTION(10061, "角色保存失败"),
    USER_BASIC_MOBILE_EXIST_EXCEPTION(10062, "用户手机号已存在"),
    LOGIN_BY_COMPANY_EXCEPTION(10063, "切换企业登录失败"),
    PARENT_DEPARTMENT_NOT_UPDATE_EXCEPTION(10064, "根部门名不可修改"),
    NOT_LEAVE_STATUS_EXCEPTION(10065, "账户非离职状态状态"),
    ALREADY_IS_APPOINT_TYPE_EXCEPTION(10066, "该生产已是指定月份类型"),
    ALREADY_IS_CUT_TYPE_EXCEPTION(10067, "该生产已是截断月份类型"),
    ALREADY_IS_MONTH_TYPE_EXCEPTION(10068, "该生产已是自然月月份类型"),
    PASSWORD_UPDATE_EXCEPTION(10069, "密码格式: 8-16位数字和字母的组合"),
    USER_ON_JOB_NOT_INVITE(10070, "该员工为在职状态,无法接受邀请", true),
    NOT_ROLE_SCAN(10071, "无扫码权限"),
    COMPANY_NO_ENABLE(10072, "企业暂未启用", true),
    ONLY_OWN_NUMBER(10073, "该上数仅可选择自己", true),
    NOT_ROLE_NUMBER_MANAGER(10074, "无上数管理权限"),
    COMPANY_IS_LOG_OFF(10075, "登录所在企业已注销"),
    COMPANY_OWN_NOT_LOG_OFF(10076, "企业创建者暂不可注销,请联系管理员"),
    PROCESS_PRICE_BATCH_NUMBER_REUSE(10077, "工序批量上数用户重复"),
    PATTEN_MODULE_SAME_NAME(10078, "模板名称不能重复"),
    PERMISSION_NO_PROCESS_TARGET_USER_NUMBER__EXCEPTION(10079, "所选员工无法上数", true),
    ACCOUNT_OLD_PASSWORD_NOT_MATCH_EXCEPTION(10080, "旧密码输入不正确"),
    COMPANY_OWN_NOT_DELETE(10081, "企业创建者暂不可删除,请联系管理员"),
    PROCESS_PRICE_EXIST_NUMBER_NOT_DELETE(10082, "已存在上数,不可删除"),
    USER_STATUS_NOT_LEAVE(10083, "该员工暂未离职"),
    COMPANY_PARTNER_EXIST_EXCEPTION(10084, "该企业已经是合作企业"),
    ORDER_EXIST_OUT_EXCEPTION(10085, "该订单已发单"),
    BACK_AUDIT_STATUS_NOT_PENDING_EXCEPTION(10086, "回料审核状态非待处理"),
    ORDER_FINISH_OUT_EXCEPTION(10087, "订单已完成,不可发单"),
    PURCHASE_BACK_EXIST_EXCEPTION(10088, "当前采购单还有\"未回料的物料\",无法变更为已完成"),
    BACK_AUDIT_STATUS_NOT_CONFIRMING_EXCEPTION(10089, "回料审核状态非待确认"),
    OWN_USER_INFO_SCAN_EXCEPTION(10090, "企业角色没有上数权限"),
    INVITE_COMPANY_SAME_OWN_EXCEPTION(10091, "不可选择本企业"),
    REVENUE_TYPE_NOT_SAME_EXCEPTION(10092, "收支分类类型不一致"),
    CHILD_REVENUE_CATEGORY_ERROR(10093, "存在子分类,不可删除"),
    LINK_DATA_REVENUE_CATEGORY_ERROR(10094, "该分类存在关联数据,不可删除"),
    ATTEND_RULE_SAME_ERROR(10095, "已经设置过打卡规则,不可重复设置"),
    TO_WORK_ALREADY_ERROR(10096, "上班已打卡"),
    OFF_WORK_ALREADY_ERROR(10097, "下班已打卡"),
    TO_WORK_TIME_ERROR(10098, "不在上班打卡时间"),
    OFF_WORK_TIME_ERROR(10099, "不在下班打卡时间"),
    WORK_NOT_NEED_TODAY_ERROR(10100, "今日不需要打卡"),
    NOT_TO_WORK_TODAY_ERROR(10101, "今日未打上班卡"),
    ATTEND_RULE_ERROR(10102, "打卡规则错误"),
    PRICE_NAME_IS_EXIST(10103, "价格名称已存在"),
    PRICE_IS_NOT_EXIST(10104, "价格名称不存在"),
    REVENUE_NAME_SAME_EXCEPTION(10105, "收支分类名重复"),
    STORE_IS_INSUFFICIENT(10106, "仓库库存不足"),
    SHEET_IS_INSUFFICIENT(10107, "请选择正确的出/入库单"),
    SHEET_IS_NOT_DELETED(10108, "出/入库单无法删除"),
    PROCESS_NAME_IS_EXIST(10109, "流程名称已存在"),
    COMPANY_OR_NAME_EXIST_EXCEPTION(10110, "已存在重复手机号或者企业名"),
    CUSTOMER_CATEGORY_NAME_EXIST_EXCEPTION(10111, "已存在重复企业分类名"),
    SCHEDULE_PRODUCT_IS_EXIST(10112, "流程中存在数据无法删除"),
    UPDATE_ATTEND_RECORD_ERROR(10113, "修改打卡时间错误"),
    UPDATE_ATTEND_RECORD_TODAY_ERROR(10114, "当天打卡时间不可修改"),
    ATTEND_RULE_SAME_USER_DEP_ERROR(10115, "部分用户或者部门已存在打卡规则"),
    CATEGORY_NAME_IS_EXIST(10116, "同一级分类中存在相同名称"),
    PRODUCT_COLUMN_ERROR(10117, "上传文件的列名不正确"),
    PRODUCT_INFORMATION_IS_NOT_EXIST(10118, "商品信息不存在"),

    PRODUCT_DATA_IS_EXIST(10119, "分类下存在数据无法删除"),
    PRODUCT_VALUE_IS_EXIST(10120, "商品中存在该信息无法删除"),
    BRAND_NOT_EXIST(10121, "品牌不存在"),
    BRAND_HAS_PRODUCT(10122, "品牌被使用无法删除"),
    BARCODE_CONFIG_IS_NOT_EXIST(10123, "请先配置条码类型"),
    BARCODE_IS_FULL(10124, "条码超过最大数量"),
    BARCODE_EXIST(10125, "条码已存在"),
    PRODUCT_COLOR_IS_EXIST(10126, "颜色编码/颜色名称不允许重复"),
    PRODUCT_SHAPE_IS_EXIST(10127, "款式名称不允许重复"),
    PRODUCT_BRAND_IS_EXIST(10128, "品牌名称不允许重复"),
    PRODUCT_SIZE_IS_EXIST(10128, "同一尺码组别中尺码名称不允许重复"),
    BARCODE_IS_ERROR(10129, "条码格式错误"),
    BATCH_INFO_ADD_LIST_LOCK_ERROR(10130, "当前分扎床次正在编辑中"),

    /**
     * 校验(参数/查询结果)异常 code_start = 20000
     */
    CHECK_EXCEPTION(20000, "校验失败"),
    PARAM_CHECK_EXCEPTION(20001, "参数校验异常"),
    RESULT_CHECK_EXCEPTION(20002, "结果校验异常"),
    RESULT_NO_EXIST_EXCEPTION(20003, "结果不存在"),

    API_EXCEPTION(30000, "调用api失败"),
    TENCENT_API_EXCEPTION(31000, "调用企业微信api失败"),
    DG_API_EXCEPTION(32000, "调用api失败"),


    /**
     * 业务异常 code_start = 100000, 具体的异常码见在每个微服务内部定义
     * 例如${@link }
     */
    BUSINESS_EXCEPTION(100000, "业务处理异常"),


    ;
    private int code;
    private String msg;
    private Boolean logic;

    ExceptionEnum(int code, String msg, Boolean logic) {
        this.code = code;
        this.msg = msg;
        this.logic = true;
    }

    ExceptionEnum(int code, String msg) {
        this.code = code;
        this.msg = msg;
        this.logic = false;
    }
}
